#ifndef BAIDUTRANSLATE_H
#define BAIDUTRANSLATE_H

class QNetworkAccessManager;
#include <QDebug>
#include <QEventLoop>
#include <QTimer>

constexpr char JS_SCRIPT[] = R"(
function a(r, o) {
    for (var t = 0; t < o.length - 2; t += 3) {
        var a = o.charAt(t + 2);
        a = a >= "a" ? a.charCodeAt(0) - 87 : Number(a),
        a = "+" === o.charAt(t + 1) ? r >>> a: r << a,
        r = "+" === o.charAt(t) ? r + a & 4294967295 : r ^ a
    }
    return r
}
var C = null;
var token = function(r, _gtk) {
    var o = r.length;
    o > 30 && (r = "" + r.substr(0, 10) + r.substr(Math.floor(o / 2) - 5, 10) + r.substring(r.length, r.length - 10));
    var t = void 0,
    t = null !== C ? C: (C = _gtk || "") || "";
    for (var e = t.split("."), h = Number(e[0]) || 0, i = Number(e[1]) || 0, d = [], f = 0, g = 0; g < r.length; g++) {
        var m = r.charCodeAt(g);
        128 > m ? d[f++] = m: (2048 > m ? d[f++] = m >> 6 | 192 : (55296 === (64512 & m) && g + 1 < r.length && 56320 === (64512 & r.charCodeAt(g + 1)) ? (m = 65536 + ((1023 & m) << 10) + (1023 & r.charCodeAt(++g)), d[f++] = m >> 18 | 240, d[f++] = m >> 12 & 63 | 128) : d[f++] = m >> 12 | 224, d[f++] = m >> 6 & 63 | 128), d[f++] = 63 & m | 128)
    }
    for (var S = h,
    u = "+-a^+6",
    l = "+-3^+b+-f",
    s = 0; s < d.length; s++) S += d[s],
    S = a(S, u);

    return S = a(S, l),
    S ^= i,
    0 > S && (S = (2147483647 & S) + 2147483648),
    S %= 1e6,
    S.toString() + "." + (S ^ h)
}

)";


class BaiduTranslate : public QObject
{
    Q_OBJECT

public:
    static BaiduTranslate& instance()
    {
        static BaiduTranslate baiduTranslate;
        return baiduTranslate;
    }
    BaiduTranslate(const BaiduTranslate& bai) = delete;
    BaiduTranslate& operator==(const BaiduTranslate& bai) = delete;
    QString TranslateText(QString text, float timeleft);
    int ScreenShot();
    QString OCRTranslate(float timeLeft, bool screenshot);
    QString OCRText(float timeLeft, bool screenshot);
    QString HanDict(QString keyWord);
    QByteArray getUrlRawContent(QString url_str);

private:
    BaiduTranslate();
    QEventLoop loop;
    QTimer timer;
    QNetworkAccessManager *manager;
    QString gtk;
    QString token;
    QString access_token;
    QString tokenURL;
    QString getUrl(QString url);
    QString getSign(QString query);
    void loadMainPage();
    QString langDetect(QString query);
    QJsonObject dictionary(QString query, QString dst="zh", QString src="", float timeLeft=2.5);

    bool getAccessTokenFromURL(QString url);
    bool checkAccessToken();

};

#endif // BAIDUTRANSLATE_H
